package com.yls.except.util;

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OcrCard {
    public static final String APP_ID = "10746721";
    public static final String API_KEY = "zTxRltK5bLGGk9Z5iiX1OY1v";
    public static final String SECRET_KEY = "wtO03eIjpD8nBlgLlvHwWZ9Wt7qZLPWd";
    public static final AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

    public static void main(String[] args) {
        System.out.println(getCardInfo("D:/7.jpg", "2"));
        System.out.println(getBankCardInfo("D:/bank1.jpg"));
        System.out.println(getBankCardInfo("D:/bank2.jpg"));
        System.out.println(getBankCardInfo("D:/bank3.jpg"));
        System.out.println(getDrivingLicenseInfo("D:/driver1.jpg"));
        System.out.println(getDrivingLicenseInfo("D:/driver2.jpg"));
        System.out.println(getDrivingLicenseInfo("D:/driver3.jpg"));
        System.out.println(getVehicleLicenseInfo("D:/vehicle1.jpg"));
        System.out.println(getVehicleLicenseInfo("D:/vehicle2.jpg"));
        System.out.println(getVehicleLicenseInfo("D:/vehicle3.jpg"));
        System.out.println(getPlateLicenseInfo("D:/car1.jpg"));
        System.out.println(getPlateLicenseInfo("D:/car4.jpg"));
    }

    /**
     * 根据身份证图片获取相关信息
     * @param imgpath   图片地址
     * @param type 类型（1：正面  2：反面）
     * @return
     */
    public static Map<String, Object> getCardInfo(String imgpath, String type){
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");  //是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true：检测朝向；- false：不检测朝向。
        options.put("detect_risk", "false"); //是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能，默认不开启，即：false。可选值:true-开启；false-不开启
        //设置身份证正反面 front：身份证正面；back：身份证背面
        String idCardSide = "2".equals(type) ? "back" : "front";
        // 参数为本地图片路径
        JSONObject res = client.idcard(imgpath, idCardSide, options);
        try {
            Map<String, Object> map = GeneralResult.jsonStrToMap(res.toString(2));
            JSONObject words_result = (JSONObject) map.get("words_result");
            System.out.println(words_result);
            Map<String, Object> result = new HashMap<String, Object>();
            if(words_result == null || words_result.length() <= 0)
                return new HashMap<>();
            if("1".equals(type)) {
                result.put("name", words_result.has("姓名") ? words_result.getJSONObject("姓名").get("words") : "");
                result.put("nation", words_result.has("民族") ? words_result.getJSONObject("民族").get("words") : "");
                result.put("address", words_result.has("住址") ? words_result.getJSONObject("住址").get("words") : "");
                result.put("cardNo", words_result.has("公民身份号码") ? words_result.getJSONObject("公民身份号码").get("words") : "");
                result.put("birthday", words_result.has("出生") ? words_result.getJSONObject("出生").get("words") : "");
                result.put("sex", words_result.has("性别") ? words_result.getJSONObject("性别").get("words") : "");
            } else {
                result.put("expirationTime", words_result.has("失效日期") ? words_result.getJSONObject("失效日期").get("words") : "");
                result.put("issueOrganization", words_result.has("签发机关") ? words_result.getJSONObject("签发机关").get("words") : "");
                result.put("issueTime", words_result.has("签发日期") ? words_result.getJSONObject("签发日期").get("words") : "");
            }
            return result;
            // 参数为本地图片二进制数组
//            byte[] file = readImageFile(image);
//            res = client.idcard(file, idCardSide, options);
//            System.out.println(res.toString(2));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return new HashMap<>();
    }

    /**
     * 根据银行卡号获取相关信息
     * @param imgpath
     * @return
     */
    public static Map<String, Object> getBankCardInfo(String imgpath){
        HashMap<String, String> options = new HashMap<String, String>();
//        options.put("detect_direction", "true");  //是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true：检测朝向；- false：不检测朝向。
//        options.put("detect_risk", "false"); //是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能，默认不开启，即：false。可选值:true-开启；false-不开启
        //设置身份证正反面 front：身份证正面；back：身份证背面
//        String idCardSide = "front";
        // 参数为本地图片路径
        JSONObject res = client.bankcard(imgpath, options);
        try {
            Map<String, Object> map = GeneralResult.jsonStrToMap(res.toString(2));
            if(StringIsempty.isNullMap(map))
                return new HashMap<>();
            JSONObject words_result = (JSONObject) map.get("result");
            if(words_result == null || words_result.length() <= 0)
                return new HashMap<>();
            Map<String, Object> result = new HashMap<String, Object>();
            result.put("bankCardNumber", words_result.get("bank_card_number"));
            result.put("bankName", words_result.get("bank_name"));
            result.put("bankCardType", words_result.get("bank_card_type"));
            return result;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return new HashMap<>();
    }

    /**
     * 根据图片获取驾驶证相关信息
     * @param imgpath
     * @return
     */
    public static Map<String, Object> getDrivingLicenseInfo(String imgpath){
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");  //是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true：检测朝向；- false：不检测朝向。
//        options.put("detect_risk", "false"); //是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能，默认不开启，即：false。可选值:true-开启；false-不开启
        //设置身份证正反面 front：身份证正面；back：身份证背面
//        String idCardSide = "front";
        // 参数为本地图片路径
        JSONObject res = client.drivingLicense(imgpath, options);
        try {
            Map<String, Object> map = GeneralResult.jsonStrToMap(res.toString(2));
            if(StringIsempty.isNullMap(map))
                return new HashMap<>();
            JSONObject words_result = (JSONObject) map.get("words_result");
            if(words_result == null || words_result.length() <= 0)
                return new HashMap<>();
            Map<String, Object> result = new HashMap<String, Object>();
            result.put("cardNo", words_result.has("证号") ?words_result.getJSONObject("证号").get("words") : "");
            result.put("expirationTime", words_result.has("有效期限") ?words_result.getJSONObject("有效期限").get("words") : "");
            result.put("drivingModel", words_result.has("准驾车型") ?words_result.getJSONObject("准驾车型").get("words") : "");
            result.put("originTime", words_result.has("有效起始日期") ?words_result.getJSONObject("有效起始日期").get("words") : "");
            result.put("address", words_result.has("住址") ?words_result.getJSONObject("住址").get("words") : "");
            result.put("name", words_result.has("姓名") ?words_result.getJSONObject("姓名").get("words") : "");
            result.put("nationality", words_result.has("国籍") ?words_result.getJSONObject("国籍").get("words") : "");
            result.put("birthday", words_result.has("出生日期") ?words_result.getJSONObject("出生日期").get("words") : "");
            result.put("sex", words_result.has("性别") ?words_result.getJSONObject("性别").get("words") : "");
            result.put("issueDate", words_result.has("初次领证日期") ?words_result.getJSONObject("初次领证日期").get("words") : "");
            return result;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据图片获取行驶证相关信息
     * @param imgpath
     * @return
     */
    public static Map<String, Object> getVehicleLicenseInfo(String imgpath){
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");  //是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:- true：检测朝向；- false：不检测朝向。
        options.put("accuracy", "normal");  //normal 使用快速服务，1200ms左右时延；缺省或其它值使用高精度服务，1600ms左右时延
        JSONObject res = client.drivingLicense(imgpath, options);
        try {
            Map<String, Object> map = GeneralResult.jsonStrToMap(res.toString(2));
            if(StringIsempty.isNullMap(map))
                return new HashMap<>();
            JSONObject words_result = (JSONObject) map.get("words_result");
            if(words_result == null || words_result.length() <= 0)
                return new HashMap<>();
            Map<String, Object> result = new HashMap<String, Object>();
            result.put("cardModel", words_result.has("品牌型号") ? words_result.getJSONObject("品牌型号").get("words") : "");
            result.put("issueDate", words_result.has("发证日期") ? words_result.getJSONObject("发证日期").get("words") : "");
            result.put("useProperty", words_result.has("使用性质") ? words_result.getJSONObject("使用性质").get("words") : "");
            result.put("engineNumber", words_result.has("发动机号码") ? words_result.getJSONObject("发动机号码").get("words") : "");
            result.put("cardNumber", words_result.has("号牌号码") ? words_result.getJSONObject("号牌号码").get("words") : "");
            result.put("name", words_result.has("所有人") ? words_result.getJSONObject("所有人").get("words") : "");
            result.put("address", words_result.has("住址") ? words_result.getJSONObject("住址").get("words") : "");
            result.put("registerTime", words_result.has("注册日期") ? words_result.getJSONObject("注册日期").get("words") : "");
            result.put("vehicleCode", words_result.has("车辆识别代号") ? words_result.getJSONObject("车辆识别代号").get("words") : "");
            result.put("vehicleType", words_result.has("车辆类型") ? words_result.getJSONObject("车辆类型").get("words") : "");
            return result;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据图片获取车牌号信息
     * @param imgpath
     * @return
     */
    public static List<Map<String, Object>> getPlateLicenseInfo(String imgpath){
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("multi_detect", "true");  //是否检测多张车牌，默认为false，当置为true的时候可以对一张图片内的多张车牌进行识别
        options.put("accuracy", "normal");  //normal 使用快速服务，1200ms左右时延；缺省或其它值使用高精度服务，1600ms左右时延
        JSONObject res = client.plateLicense(imgpath, options);
        try {
            Map<String, Object> map = GeneralResult.jsonStrToMap(res.toString(2));
            if(StringIsempty.isNullMap(map))
                return new ArrayList<Map<String, Object>>();
            JSONArray words_result = (JSONArray) map.get("words_result");
            if(words_result == null || words_result.length() <= 0)
                return new ArrayList<Map<String, Object>>();
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < words_result.length(); i ++) {
                JSONObject jsonObject = words_result.getJSONObject(i);
                Map<String, Object> result = new HashMap<String, Object>();
                result.put("color", jsonObject.get("color"));
                result.put("number", jsonObject.get("number"));
                list.add(result);
            }
            return list;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return new ArrayList<Map<String, Object>>();
    }
}
